from pydantic import BaseModel, Field, field_validator
from typing import Any

# 基础模型（公共字段）
class UserBase(BaseModel):
    """用户基础模型（所有用户相关模型的基类）"""
    username: str = Field(
        min_length=3, 
        max_length=20, 
        pattern=r"^[a-zA-Z0-9_]+$", 
        description="用户名（仅允许字母、数字、下划线，3-20位）"
    )

    model_config = {
        'from_attributes': True  # 启用 ORM 模式
    }

# 基础响应模型（减少重复代码）
class BaseResponse(BaseModel):
    """所有业务响应的基础模型（包含通用消息字段）"""
    message: str = "Operation successful"  # 默认成功消息（可覆盖）

# 创建用户请求模型（含敏感信息）
class UserCreate(UserBase):
    """
    用户创建请求模型（含敏感信息）
    用于接收客户端提交的用户创建请求
    """
    password: str = Field(
        min_length=8, 
        max_length=20, 
        description="密码（长度8-20位，必须包含字母和数字）"
    )
    
    @field_validator("password")
    def validate_password_complexity(cls, v: str):
        """密码复杂度验证（必须同时包含字母和数字）"""
        if not (any(c.isalpha() for c in v) and any(c.isdigit() for c in v)):
            raise ValueError("密码必须同时包含字母和数字")
        return v

# 用户响应模型（不含敏感信息）
class UserResponse(UserBase):
    """
    用户响应模型（不含敏感信息）
    用于返回给客户端的用户信息（自动过滤密码字段）
    """
    class Config:
        from_attributes = True  # 支持从SQLAlchemy ORM对象直接转换

# 用户创建响应模型（继承基础响应）
class UserCreateResponse(BaseResponse):
    """用户创建成功响应模型（返回创建的用户信息）"""
    user: UserResponse  # 嵌套的用户基础信息

# 用户登录请求模型
class UserLoginRequest(UserBase):
    """
    用户登录请求模型
    用于接收客户端提交的用户登录请求（密码不验证格式，因可能使用旧系统密码）
    """
    password: str = Field(description="用户密码（需与数据库加密后的值匹配）")

# 用户登录响应模型（继承基础响应）
class UserLoginResponse(BaseResponse):
    """用户登录成功响应模型（返回登录的用户信息）"""
    user: UserResponse  # 嵌套的用户基础信息


